// 在文件顶部添加类型声明
import type { Plugin } from 'vue';
// 引入fast-crud核心模块
import {FastCrud, useTypes} from '@fast-crud/fast-crud';
const {getType} = useTypes(); // 获取类型工具函数
import '@fast-crud/fast-crud/dist/style.css'; // 核心样式
import {setLogger} from '@fast-crud/fast-crud'; // 日志配置工具
import {getBaseURL} from '/@/utils/baseUrl'; // 项目基础路径工具

// Element Plus UI集成
import ui from '@fast-crud/ui-element';
// 项目自定义请求模块
import {request} from '/@/utils/service';

// 扩展插件：富文本编辑器和文件上传
import {FsExtendsEditor, FsExtendsUploader } from '@fast-crud/fast-extends';
import '@fast-crud/fast-extends/dist/style.css'; // 扩展插件样式

// 项目工具函数
import {successNotification} from '/@/utils/message'; // 成功提示工具
import XEUtils from "xe-utils"; // 数据处理工具库

export default {
    // Vue插件安装方法
    async install(app: any, options: any) {
        // 注册Element Plus UI库
        app.use(ui);
        
        // 配置并注册FastCrud核心功能
        app.use(FastCrud, {
            // 字典数据请求配置
            async dictRequest({dict,url}: any) {
                const {isTree} = dict; // 是否树形结构
                return await request({url: url, params: dict.params || {}}).then((res: any) => {
                    return isTree ? XEUtils.toArrayTree(res.data, {parentKey: 'parent'}) : res.data; // 树形数据转换
                });
            },

            // 全局CRUD配置
            commonOptions() {
                return {
                    request: {
                        // 请求参数转换（适配Django后端）
                        transformQuery: ({page, form, sort}: any) => {
                            if (sort.asc !== undefined) {
                                form['ordering'] = `${sort.asc ? '' : '-'}${sort.prop}`; // 排序字段处理
                            }
                            return {page: page.currentPage, limit: page.pageSize, ...form}; // 分页参数转换
                        },
                        // 响应数据转换
                        transformRes: ({res}: any) => ({
                            records: res.data,   // 数据列表
                            currentPage: res.page, // 当前页
                            pageSize: res.limit,   // 每页数量
                            total: res.total       // 总数
                        }),
                    },
                    form: {
                        // 表单提交后处理
                        afterSubmit(ctx: any) {
                            if (ctx.res.code == 2000) {
                                successNotification(ctx.res.msg); // 成功提示
                            }
                        },
                    }
                };
            },
            logger: { off: { tableColumns: false } } // 日志配置
        });

        // 注册富文本编辑器插件
        app.use(FsExtendsEditor, {
            wangEditor: { width: 300 }, // 编辑器宽度配置
        });

        // 注册文件上传插件
        app.use(FsExtendsUploader, {
            defaultType: "form", // 默认上传类型
            form: {
                action: `/api/system/file/`, // 上传接口地址
                name: "file", // 上传字段名称
                // 自定义上传实现
                uploadRequest: async ({ action, file, onProgress }: any) => {
                    const data = new FormData();
                    data.append("file", file);
                    return await request({ // 调用项目封装的请求方法
                        url: action,
                        method: "post",
                        headers: { "Content-Type": "multipart/form-data" },
                        data,
                        onUploadProgress: (p: any) => {
                            onProgress({percent: Math.round((p.loaded / p.total) * 100)}); // 上传进度处理
                        }
                    });
                },
                // 上传结果处理
                successHandle(ret: any) {
                    return { 
                        url: getBaseURL(ret.data.url), // 添加基础路径
                        key: ret.data.id,
                        ...ret.data
                    };
                }
            },
            // 值转换器
            valueBuilder(context: any){
                const { row, key } = context;
                return getBaseURL(row[key]); // 添加基础路径
            }
        })

        setLogger({level: 'error'}); // 设置日志级别为error

        // 配置字典组件自动染色和对齐
        ['dict-cascader', 'dict-checkbox', 'dict-radio', 'dict-select', 'dict-switch', 'dict-tree'].forEach((val) => {
            getType(val).column.component.color = 'auto'; // 自动染色
            getType(val).column.align = 'center'; // 居中对齐
        });

        // 设置表单字段默认placeholder
        [
            {key: 'text', placeholder: "请输入"},
            {key: 'textarea', placeholder: "请输入"},
            {key: 'input', placeholder: "请输入"},
            {key: 'password', placeholder: "请输入"}
        ].forEach((val) => {
            // 搜索框配置
            if (getType(val.key)?.search?.component) {
                getType(val.key).search.component.placeholder = val.placeholder;
            }
            // 表单配置
            if (getType(val.key)?.form?.component) {
                getType(val.key).form.component.placeholder = val.placeholder;
            }
            // 列对齐配置
            if (getType(val.key)?.column?.align) {
                getType(val.key).column.align = 'center';
            }
        });
    },
} as Plugin;